﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Aga.Psad.Mvc.Services.Dtos;

namespace Aga.Informatizacion.Despachos
{
    public partial class EditarDespachos : Form
    {
        public EditarDespachos()
        {
            InitializeComponent();

            Declarantes = new BindingList<ClienteDto>();
        }

        public string FolderPath { get; set; }

        public BindingList<DespachoDto> Despachos { get; set; }

        private BindingList<ClienteDto> Declarantes { get; set; }

        private Dictionary<int, BindingList<ClienteDeClienteDto>> ImportadoresPorDeclarante = new Dictionary<int, BindingList<ClienteDeClienteDto>>();

        private void NuevoLote_Load(object sender, EventArgs e)
        {
            AddBindings();

            CargarDeclarantes();

            CargarImportadores();

            LeerArchivos();
        }

        private void trvFiles_AfterSelect(object sender, TreeViewEventArgs e)
        {
            Browse(e.Node);
            SeleccionarDespacho(e.Node);
        }

        private void despachoBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            var despacho = despachoBindingSource.Current as DespachoDto;
            if (despacho != null)
            {
                var node = trvFiles.Nodes[0].Nodes.Cast<TreeNode>().Where(n => n.Tag.Equals(despacho)).SingleOrDefault();
                if (node != null)
                {
                    trvFiles.SelectedNode = node;
                }
            }
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            var declarante = this.cmbDeclarante.SelectedItem as ClienteDto;
            var importador = this.cmbImportador.SelectedItem as ClienteDeClienteDto;

            int caja = 0;
            int declaranteId = declarante != null ? declarante.Id : 0;
            int importadorId = importador != null ? importador.Id : 0;
            string nombreDeclarante = declarante != null ? declarante.RazonSocial : string.Empty;
            string nombreImportador = importador != null ? importador.RazonSocial : string.Empty;

            Int32.TryParse(txtCaja.Text, out caja);

            foreach (DataGridViewRow row in dgvDespachos.SelectedRows)
            {
                var despacho = row.DataBoundItem as DespachoDto;
                if (despacho != null)
                {
                    despacho.DeclaranteId = declaranteId;
                    despacho.ImportadorId = importadorId;
                    despacho.NombreDeclarante = nombreDeclarante;
                    despacho.NombreImportador = nombreImportador;
                    despacho.Caja = caja;
                }
            }

            dgvDespachos.Refresh();
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Control | Keys.Down))
            {
                MessageBox.Show("What the Ctrl+Down");
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void CargarDeclarantes()
        {
            using (var service = new UploadDataServiceClient())
            {
                var declarantes = service.ObtenerTodosLosDeclarantes();
                foreach (var d in declarantes)
                    Declarantes.Add(d);


                //this.cmbDeclarante.DisplayMember = "RazonSocial";
                //this.cmbDeclarante.DataSource = this.Declarantes;

                this.declarantesBindingSource.DataSource = Declarantes;

            }
        }

        private void CargarImportadores()
        {
            var declarante = this.declarantesBindingSource.Current as ClienteDto;
            if (declarante != null)
            {
                if (!ImportadoresPorDeclarante.ContainsKey(declarante.Id))
                {
                    using (var service = new UploadDataServiceClient())
                    {
                        var imp = service.ObtenerImportadoresPorClienteId(declarante.Id);

                        ImportadoresPorDeclarante.Add(declarante.Id, new BindingList<ClienteDeClienteDto>(imp));
                    }
                }

                var importadores = ImportadoresPorDeclarante[declarante.Id];
                this.importadoresBindingSource.DataSource = importadores;

            }
        }

        private void AddBindings()
        {
            this.txtCaja.DataBindings.Add("Text", despachoBindingSource, "Caja");
            this.txtLegajo.DataBindings.Add("Text", despachoBindingSource, "Legajo");

            
        }

        private void SeleccionarDespacho(TreeNode treeNode)
        {
            if (treeNode == null)
                return;

            DespachoDto despacho = treeNode.Tag as DespachoDto;
            
            if (despacho != null)
            {
                int index = Despachos.IndexOf(despacho);
                despachoBindingSource.Position = index;
            }
            else
            {
                if (treeNode.Tag == null && treeNode.Parent == null) // Es el nodo raíz
                    SeleccionarDespacho(treeNode.FirstNode);
                else
                    SeleccionarDespacho(treeNode.Parent);
            }
        }

        private void MostrarCampos(DespachoDto despacho)
        {
            throw new NotImplementedException();
        }

        private void LeerArchivos()
        {
            Despachos = new BindingList<DespachoDto>();

            // ToDo: Leer Archivos aqui.
            DirectoryInfo dir = new DirectoryInfo(this.FolderPath);
            var files = dir.GetFiles("????????????????_??_???.pdf", SearchOption.AllDirectories);

            var despachos = files.GroupBy(f => f.Name.Substring(0, 16));

            var rootNode =
                new TreeNode("Despachos");

            foreach (var d in despachos.OrderBy(f => f.Key))
            {
                //string legajoParcial = d.Key.Substring(0, 12) + "****";
                string legajoParcial = d.Key;

                var despacho = new DespachoDto()
                {
                    Legajo = d.Key
                };
                Despachos.Add(despacho);

                var nodeDespacho = new TreeNode(legajoParcial)
                {
                    ImageIndex = 1,
                    SelectedImageIndex = 1,
                    StateImageIndex = 1,
                    Tag = despacho
                };

                rootNode.Nodes.Add(nodeDespacho);

                foreach (var familia in d.GroupBy(f => f.Name.Substring(17, 2)).OrderBy(f => f.Key))
                {
                    despacho.Familias += String.IsNullOrEmpty(despacho.Familias) ? familia.Key : "," + familia.Key;

                    var nodeFamilia = new TreeNode(String.Format("Familia {0}", familia.Key))
                    {
                        ImageIndex = 2,
                        SelectedImageIndex = 2,
                        StateImageIndex = 2
                    };

                    nodeDespacho.Nodes.Add(nodeFamilia);

                    foreach (var pagina in familia.OrderBy(f => f.Name))
                    {
                        var nodePagina = new TreeNode(String.Format("Pagina {0}", Convert.ToInt32(pagina.Name.Substring(20, 3))))
                        {
                            ImageIndex = 3,
                            SelectedImageIndex = 3,
                            StateImageIndex = 3,
                            Tag = pagina
                        };

                        nodeFamilia.Nodes.Add(nodePagina);
                    }
                }
            }

            this.trvFiles.Nodes.Add(rootNode);

            despachoBindingSource.DataSource = Despachos;
        }

        private void ExpandFirstNode(TreeNode node)
        {
            if (node != null)
            {
                node.Expand();
                ExpandFirstNode(node.FirstNode);
            }
        }

        private void Browse(TreeNode node)
        {
            if (node != null)
            {
                FileInfo archivo = node.Tag as FileInfo;
                if (archivo != null)
                {
                    documentBrowser.Navigate(archivo.FullName);
                    documentBrowser.Refresh();
                }
                else
                    Browse(node.FirstNode);
            }

        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            despachoBindingSource.MovePrevious();
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            despachoBindingSource.MoveNext();
        }

        private void declarantesBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            CargarImportadores();
        }

        private void btnFinalizar_Click(object sender, EventArgs e)
        {
            VerificarDatos();
        }

        private void VerificarDatos()
        {
            var errores = new StringBuilder("Se encontraron los siguientes errores");
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void NuevoLote_FormClosing(object sender, FormClosingEventArgs e)
        {
            var result = MessageBox.Show(
                "¿Confirma que desea cerrar?\nSi tiene cambios sin guardar se perderán.",
                "Cerrar",
                MessageBoxButtons.YesNoCancel,
                MessageBoxIcon.Exclamation,
                MessageBoxDefaultButton.Button2);

            if (result != DialogResult.Yes)
            {
                e.Cancel = true;
            }

        }

    }
}
